﻿using System;
using System.Collections.Generic;
using System.Linq;
using AlipayClass;
using Service;

namespace ECommerce.Alipay
{
	public partial class Notify : BasePage
	{
		private IOrderService _OrderService;

		protected void Page_Load(object sender, EventArgs e)
		{
			SortedDictionary<string, string> sArrary = GetRequestPost();
			///////////////////////以下参数是需要设置的相关配置参数，设置后不会更改的//////////////////////
			string partner = "2088302091633148";                                     //合作身份者ID
			string key = "rs8e8p90hciw3rlwqtvxjhqfu3s0f6kz";                         //安全检验码
			string input_charset = "utf-8";                     //字符编码格式 目前支持 gbk 或 utf-8
			string sign_type = "MD5";                           //加密方式 不需修改
			string transport = "http";                         //访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
			//////////////////////////////////////////////////////////////////////////////////////////////

			if (sArrary.Count > 0)//判断是否有带返回参数
			{
				AlipayNotify aliNotify = new AlipayNotify(sArrary, Request.Form["notify_id"], partner, key, input_charset, sign_type, transport);
				string responseTxt = aliNotify.ResponseTxt; //获取远程服务器ATN结果，验证是否是支付宝服务器发来的请求
				string sign = Request.Form["sign"];         //获取支付宝反馈回来的sign结果
				string mysign = aliNotify.Mysign;           //获取通知返回后计算后（验证）的加密结果

				//写日志记录（若要调试，请取消下面两行注释）
				//string sWord = "responseTxt=" + responseTxt + "\n notify_url_log:sign=" + Request.Form["sign"] + "&mysign=" + mysign + "\n notify回来的参数：" + aliNotify.PreSignStr;
				//AlipayFunction.log_result(Server.MapPath("log/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", sWord);

				//判断responsetTxt是否为ture，生成的签名结果mysign与获得的签名结果sign是否一致
				//responsetTxt的结果不是true，与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
				//mysign与sign不等，与安全校验码、请求时的参数格式（如：带自定义参数等）、编码格式有关
				if (responseTxt == "true" && sign == mysign)//验证成功
				{
					//获取支付宝的通知返回参数
					string trade_no = Request.Form["trade_no"];         //支付宝交易号
					string order_no = Request.Form["out_trade_no"];     //获取订单号
					string total_fee = Request.Form["price"];           //获取总金额
					string subject = Request.Form["subject"];           //商品名称、订单名称
					string body = Request.Form["body"];                 //商品描述、订单备注、描述
					string buyer_email = Request.Form["buyer_email"];   //买家支付宝账号
					string trade_status = Request.Form["trade_status"]; //交易状态
					//int sOld_trade_status = 2;							//获取商户数据库中查询得到该笔交易当前的交易状态（商户自行编写）

					if(_OrderService == null)
					{
						_OrderService = new OrderService();
					}
					var theOrder = _OrderService.GetTheOrderByOrderNumber(order_no);
					var theOrderStatus = _OrderService.GetAllOrderStatus().Where(exp => exp.OrderStatusID == theOrder.OrderStatusID).FirstOrDefault();

					//假设：
					//sOld_trade_status=0	表示订单未处理；
					//sOld_trade_status=1	表示买家已在支付宝交易管理中产生了交易记录，但没有付款
					//sOld_trade_status=2	表示买家已在支付宝交易管理中产生了交易记录且付款成功，但卖家没有发货
					//sOld_trade_status=3	表示卖家已经发了货，但买家还没有做确认收货的操作
					//sOld_trade_status=4	表示买家已经确认收货，这笔交易完成

					if (Request.Form["trade_status"] == "WAIT_BUYER_PAY")
					{
						//表示买家已在支付宝交易管理中产生了交易记录，但没有付款
						//放入订单交易完成后的数据库更新程序代码，请务必保证response.Write出来的信息只有success
						//为了保证不被重复调用，或重复执行数据库更新程序，请判断该笔交易状态是否是订单未处理状态
						//注：该交易状态下，也可不做数据库更新程序，此时，建议把该状态的通知信息记录到商户通知日志数据库表中。
						if (theOrderStatus.OrderStatusNumber.Equals(0))
						{
							//根据订单号更新订单，把订单状态处理成交易成功
							SetTheOrder_TRADE_FINISHED(trade_no, theOrder);
						}

						Response.Write("success");
					}
					else if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS")
					{
						//表示买家已在支付宝交易管理中产生了交易记录且付款成功，但卖家没有发货
						//放入订单交易完成后的数据库更新程序代码，请务必保证response.Write出来的信息只有success
						//为了保证不被重复调用，或重复执行数据库更新程序，请判断该笔交易状态是否是WAIT_BUYER_PAY状态
						if (theOrderStatus.OrderStatusNumber.Equals((int)Data.Entity.OrderStatuses.WAIT_BUYER_PAY) ||
							theOrderStatus.OrderStatusNumber.Equals(0))
						{
							//根据订单号更新订单，把订单状态处理成交易成功
							SetTheOrder_TRADE_FINISHED(trade_no, theOrder);
						}

						Response.Write("success");
					}
					else if (Request.Form["trade_status"] == "WAIT_BUYER_CONFIRM_GOODS")
					{
						//表示卖家已经发了货，但买家还没有做确认收货的操作
						//放入订单交易完成后的数据库更新程序代码，请务必保证response.Write出来的信息只有success
						//为了保证不被重复调用，或重复执行数据库更新程序，请判断该笔交易状态是否是WAIT_SELLER_SEND_GOODS状态
						if (theOrderStatus.OrderStatusNumber.Equals((int)Data.Entity.OrderStatuses.WAIT_SELLER_SEND_GOODS))
						{
							//根据订单号更新订单，把订单状态处理成交易成功
							SetTheOrder_TRADE_FINISHED(trade_no, theOrder);
						}

						Response.Write("success");
					}
					else if (Request.Form["trade_status"] == "TRADE_FINISHED")
					{
						//表示买家已经确认收货，这笔交易完成
						//放入订单交易完成后的数据库更新程序代码，请务必保证response.Write出来的信息只有success
						//为了保证不被重复调用，或重复执行数据库更新程序，请判断该笔交易状态是否是WAIT_BUYER_CONFIRM_GOODS状态
						if (theOrderStatus.OrderStatusNumber.Equals((int)Data.Entity.OrderStatuses.WAIT_BUYER_CONFIRM_GOODS))
						{
							//根据订单号更新订单，把订单状态处理成交易成功
							SetTheOrder_TRADE_FINISHED(trade_no, theOrder);
						}

						Response.Write("success");
					}
					else
					{
						Response.Write("success");  //其他状态判断。普通即时到帐中，其他状态不用判断，直接打印success。
					}
				}
				else//验证失败
				{
					Response.Write("fail");
				}
			}
			else
			{
				Response.Write("无通知参数");
			}
		}

		private void SetTheOrder_TRADE_FINISHED(string trade_no, Data.Entity.Order theOrder)
		{
			if (_OrderService == null)
			{
				_OrderService = new OrderService();
			}

			var theNewOrderStatus = _OrderService.GetTheOrderStatusByStatusName("TRADE_FINISHED");
			theOrder.OrderStatusID = theNewOrderStatus.OrderStatusID;
			theOrder.PurchaseOrderNumber = trade_no;

			UpdateTheOrder(theOrder);

			//add note 
			var theOrderNote = new Data.Entity.OrderNote();

			theOrderNote.CreatedOn = DateTime.Now;
			theOrderNote.DisplayToUser = true;
			theOrderNote.Note = GetLocalResourceString("TRADE_FINISHED");
			theOrderNote.OrderID = theOrder.OrderID;

			if (_OrderService == null)
			{
				_OrderService = new OrderService();
			}

			_OrderService.CreateNewOrderNote(theOrderNote);
		}

		private int UpdateTheOrder(Data.Entity.Order theOrder)
		{
			if (theOrder == null || theOrder.OrderID <= 0)
			{
				return 0;
			}

			if (_OrderService == null)
			{
				_OrderService = new OrderService();
			}

			return _OrderService.UpdateOrder(theOrder);
		}

		/// <summary>
		/// 获取支付宝POST过来通知消息，并以“参数名=参数值”的形式组成数组
		/// </summary>
		/// <returns>request回来的信息组成的数组</returns>
		public SortedDictionary<string, string> GetRequestPost()
		{
			int i = 0;
			SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
			System.Collections.Specialized.NameValueCollection coll;
			//Load Form variables into NameValueCollection variable.
			coll = Request.Form;

			// Get names of all forms into a string array.
			String[] requestItem = coll.AllKeys;

			for (i = 0; i < requestItem.Length; i++)
			{
				sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
			}

			return sArray;
		}
	}
}
